/*
* Copyright (c) 2021.04，网络通信与安全紫金山实验室
* All rights reserved.
*
* 文件名称：json_bean.h
*
* 初始版本：1.0
* 作者：张浪
* 创建日期：2021年4月25日
* 摘要：对cJSON库进行了封装的jsonbean cpp类
*
*/

#ifndef JSON_BEAN_H
#define JSON_BEAN_H


#include <string>


struct cJSON;

class JsonBean
{
public:
    typedef enum _Type_
    {
        Data,//普通JSON类型
        Array//JSON数组类型
    }Type;

    /************************************************
     * 功能：构造函数
     * 输入参数：
     *      eType：Data -- 普通类型，Array -- JSON数组类型
     * ***********************************************/
    JsonBean(Type eType = Data);

    /************************************************
     * 功能：构造函数
     * 输入参数：
     *      strJsonData：JSON数据
     * ***********************************************/
    JsonBean(const std::string &strJsonData);

    /************************************************
     * 功能：拷贝构造函数
     * 输入参数：
     *      objOther：JSON对象
     * ***********************************************/
    JsonBean(const JsonBean &objOther);

    /************************************************
     * 功能：赋值构造函数
     * 输入参数：
     *      objOther：JSON对象
     * 返回值：
     *      JsonBean：新的JSON对象
     * ***********************************************/
    JsonBean& operator=(const JsonBean &objOther);

    /************************************************
     * 功能：析构函数
     * ***********************************************/
    ~JsonBean();

    /************************************************
     * 功能：解析json是否正常
     * 返回值：
     *      bool：解析结果，true -- 正常，false -- 异常
     * ***********************************************/
    bool isJsonOk() const;

    /************************************************
     * 功能：读取JSON数据
     * 返回值：
     *      std::string：JSON数据
     * ***********************************************/
    std::string data();

    /************************************************
     * 功能：读取对应无格式的JSON数据
     * 返回值：
     *      std::string：无格式JSON数据
     * ***********************************************/
    std::string unformattedData();

    /************************************************
     * 功能：返回JSON数组子对象个数
     * 返回值：
     *      int：JSON数组子对象个数
     * ***********************************************/
    int count() const;

    /************************************************
     * 功能：读取JSON数组子对象
     * 输入参数：
     *      iIndex：JSON数组子对象索引
     * 返回值：
     *      JsonBean：JSON数组子对象
     * ***********************************************/
    JsonBean at(int iIndex) const;

    /************************************************
     * 功能：判断是否是JSON数组类型
     * 返回值：
     *      bool：是否JOSN数组，true -- 是，false -- 否
     * ***********************************************/
    bool isArray() const;

    /************************************************
     * 功能：添加空数据
     * 输入参数：
     *      strKey：键值
     * ***********************************************/
    void addNull(const std::string &strKey);

    /************************************************
     * 功能：添加string型键值数据
     * 输入参数：
     *      strKey：键值
     *      pValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const char *pValue);

    /************************************************
     * 功能：设置string型键值数据
     * 输入参数：
     *      strKey：键值
     *      pValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const char *pValue);

    /************************************************
     * 功能：添加string型键值数据
     * 输入参数：
     *      strKey：键值
     *      strValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const std::string &strValue);

    /************************************************
     * 功能：设置string型键值数据
     * 输入参数：
     *      strKey：键值
     *      strValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const std::string &strValue);

    /************************************************
     * 功能：添加double型键值数据
     * 输入参数：
     *      strKey：键值
     *      dValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const double &dValue);

    /************************************************
     * 功能：设置double型键值数据
     * 输入参数  ：
     *      strKey：键值
     *      dValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const double &dValue);

    /************************************************
     * 功能：添加int型键值数据
     * 输入参数  ：
     *      strKey：键值
     *      iValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const int &iValue);

    /************************************************
     * 功能：设置int型键值数据
     * 输入参数  ：
     *      strKey：键值
     *      iValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const int &iValue);

    /************************************************
     * 功能：添加bool型键值数据
     * 输入参数：
     *      strKey：键值
     *      bValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const bool &bValue);

    /************************************************
     * 功能：设置bool型键值数据
     * 输入参数：
     *      strKey：键值
     *      bValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const bool &bValue);

    /************************************************
     * 功能：添加JSON型键值数据
     * 输入参数  ：
     *      strKey：键值
     *      objValue：数据
     * ***********************************************/
    void add(const std::string &strKey, const JsonBean &objValue);

    /************************************************
     * 功能：设置JSON型键值数据
     * 输入参数  ：
     *      strKey：键值
     *      objValue：数据
     * ***********************************************/
    void set(const std::string &strKey, const JsonBean &objValue);

    /************************************************
     * 功能：添加子对象数据到当前JSON数组中
     * 输入参数：
     *      objChildValue：子对象
     *
     *
        使用示例：
        QJson arrayJson(QJson::Array);
        for(int i = 0 ; i < 3 ; ++i)
        {
         QJson itemJson;
         itemJson.add(key1, value1);
         itemJson.add(key2, value2);

         arrayJson.addItemToArray(itemJson);
        }

        QJson resultJson;
        resultJson.add(key, arrayJson);
     * ***********************************************/
    void addDataToArray(const JsonBean &objChildValue);

    /************************************************
     * 功能：添加字符串数组到JSON中，例如{"arrVal":["str1", "str2", "str3"]}
     * 输入参数：
     *      strValue：字符串值
     * ***********************************************/
    void addDataToArray(const std::string &strValue);

    /************************************************
     * 功能：添加int数组到JSON中，例如{"intVal":[1, 2, 3]}
     * 输入参数：
     *      iValue：int数据
     * ***********************************************/
    void addDataToArray(const int &iValue);

    /************************************************
     * 功能：添加double数组到JSON中，例如{"doubleVal":[1.2, 2.3, 3.4]}
     * 输入参数：
     *      dValue：double数据
     * ***********************************************/
    void addDataToArray(const double &dValue);

    /************************************************
     * 功能：添加bool数组到JSON中，例如{"boolVal":[true, false, true]}
     * 输入参数：
     *      bValue：bool数据
     * ***********************************************/
    void addDataToArray(const bool &bValue);

    /************************************************
     * 功能：数据转换为字符串值
     * 返回值：
     *      std::string：转换后的数据
     * ***********************************************/
    std::string toString() const;

    /************************************************
     * 功能：数据转换为bool
     * 返回值：
     *      bool：转换后的数据
     * ***********************************************/
    bool toBool() const;

    /************************************************
     * 功能：数据转换为int
     * 返回值：
     *      int：转换后的数据
     * ***********************************************/
    int toInt() const;

    /************************************************
     * 功能：数据转换为double
     * 返回值：
     *      double：转换后的数据
     * ***********************************************/
    double toDouble() const;

    /************************************************
     * 功能：读取子JSON对象
     * 输入参数：
     *      strKey：键值
     * 返回值：
     *      JsonBean：对应的子对象
     * ***********************************************/
    JsonBean value(const std::string &strKey);

    /************************************************
     * 功能：JSON对象是否存在
     * 输入参数：
     *      strKey：键值
     * 返回值：
     *      bool：是否存在，true -- 存在，false -- 不存在
     * ***********************************************/
    bool isExist(const std::string &strKey);

private:
    cJSON *m_pJson; // CJSON结构体指针
    std::string m_strJsonData; // json数据缓存信息
    bool m_bOk; // json解析是否正常
};


#endif // JSON_BEAN_H

